package highFrequencyLeetcode.leetcode_62;


/**
 * 一个机器人位于一个 m x n 网格的左上角 （起始点在下图中标记为“Start” ）。
 *
 * 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角（在下图中标记为“Finish”）。
 *
 * 问总共有多少条不同的路径？
 *
 *
 *
 * 例如，上图是一个7 x 3 的网格。有多少可能的路径？
 *
 * 说明：m 和 n 的值均不超过 100。
 *
 * 示例 1:
 *
 * 输入: m = 3, n = 2
 * 输出: 3
 * 解释:
 * 从左上角开始，总共有 3 条路径可以到达右下角。
 * 1. 向右 -> 向右 -> 向下
 * 2. 向右 -> 向下 -> 向右
 * 3. 向下 -> 向右 -> 向右
 * 示例 2:
 *
 * 输入: m = 7, n = 3
 * 输出: 28
 *
 * @author Seina
 * @version 2019-07-23 07:00:09

 */
public class UniquePaths {

    /**
     * 解法1 动态规划
     * <p>
     * 当前的路线总数 = 之前算好的到达左方向格子的路线总数 + 之前算好的到达上方向格子的路线总数，因为机器人每次只能向下或者向右移动，所以到达当前格子只能从左边或者右边过来
     * <p>
     * 举例题中 m = 7，n = 3，S 表示起点，E 表示终点
     * <p>
     * |0 |1 |2 |3 |4 |5 |6 | m
     * |0 |S |1 |1 |1 |1 |1 |1 |
     * |1 |1 |2 |3 |4 |5 |6 |7 |
     * |2 |1 |3 |6 |10|15|21|E |
     * n
     *
     * @param m：横着 m 个=列网格
     * @param n：竖着 n 行网格
     * @return 多少种不同路线
     */
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) dp[i][0] = 1; // n = 0 那一行的表格，只能从左边向右过来，不能从上边向下过来，因为上边没有格子
        for (int i = 0; i < n; i++) dp[0][i] = 1; // m = 0 那一列的表格，只能从上边向下过来，不能从左边向右过来，因为左边没有格子
        for (int i = 1; i < m; i++)
            for (int j = 1; j < m; j++)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        return dp[m - 1][n - 1];//最后一个格子的路线总数
    }
}
